/** 下拉选项 */
export interface SelectOption {
  /** 文案 */
  text: string;
  /** 值 */
  value: any;

  /**
   * 抓取树数据方法
   *
   * 优先级高
   * */
  defineTreeDataFetch?: (
      searchText: string,
  ) => Promise<TreeData[]>;

  /**
   * 树选中节点改变事件
   *
   * 优先级高
   * */
  onNodeSelectChange?: (nodes: TreeData[]) => void;
  /**
   * 树选中节点改变之后
   *
   * 优先级高
   * */
  afterNodeSelectChange?: (nodes: TreeData[]) => void;
  /**
   * 树节点展开事件
   *
   * 优先级高
   * */
  onNodeExpand?: (node: TreeData) => void;
}

/** 树数据 */
export interface TreeData {
  /** id */
  id: any;
  /** 文案 */
  text: string;
  /** 子节点 */
  children?: TreeData[];

  /**
   * 树形结构用到的其他字段有
   *  - iconCls：图标类名
   *  - state：tree-file类名
   */
  [propName: string]: any;
}

export interface ArkSideTreeOptions {
  /** 搜索文本 */
  searchText?: string | null;

  /** 下拉选择值 */
  select?: any;
  /** 下拉选项（可携带树数据获取逻辑） */
  selectOptions?: SelectOption[];

  /**
   * 抓取树数据方法
   *
   * 优先级低。未定义selectOptions.defineTreeDataFetch时执行该函数
   * */
  defineTreeDataFetch?: (
      select: any,
      searchText: string,
  ) => Promise<TreeData[]>;
  /** 树数据 */
  treeData?: TreeData[];

  /** 选择的树节点 */
  selectNode?: TreeData[];
  /**
   * 树选中节点改变事件
   *
   * 优先级低。未定义selectOptions.onNodeSelectChange时执行该函数
   * */
  onNodeSelectChange?: (nodes: TreeData[]) => void;
  /**
   * 树选中节点改变之后
   *
   * 优先级低。未定义selectOptions.afterNodeSelectChange时执行该函数
   * */
  afterNodeSelectChange?: (nodes: TreeData[]) => void;
  /**
   * 树节点展开事件
   *
   * 优先级低。未定义selectOptions.onNodeExpand时执行该函数
   * */
  onNodeExpand?: (node: TreeData) => void;
}

/** options默认值 */
const arkSideTreeOptionsDefault: Partial<ArkSideTreeOptions> = {
  select: null,
  selectOptions: [],
  searchText: null,
  treeData: [],
  selectNode: [],
  onNodeSelectChange: () => {
  },
  onNodeExpand: () => {
  },
};
export default arkSideTreeOptionsDefault

/** 组件接口 */
export interface ArkSideTreeExpose {
  /**
   * 抓取数据方法
   *
   * 适用于主动触发选项获取的场景。
   * */
  fetchTreeData?: () => Promise<void>;
}